home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / mfreep / mfreep.asm next >
Assembly Source File  |  1993-07-08  |  2KB  |  136 lines

  1. ;    native memory の残量を、表示する。
  2. ;        4/2/8    ver 1.0
  3. ;            copy free Shinwa
  4. ;
  5.  
  6.  
  7. .386p
  8.  
  9. include    msdos.def
  10.  
  11. code    segment    dword 'CODE'    use32
  12.     assume    cs:code, ds:code, ss:code
  13.  
  14.  
  15. allocate_mem    macro    PAGE
  16.     mov    ebx, PAGE
  17.     mov    ah, 48h
  18.     int    21h
  19. endm
  20.  
  21. entry:
  22.     xor    ax, ax
  23.     allocate_mem    0ffffffffh
  24.  
  25.     mov    eax, ebx
  26.     inc    eax            ;プロラム自身のページ分
  27.     shl    eax, 12
  28.  
  29.     mov    ecx, eax
  30.     lea    ecx, [ecx][ecx*4]    ;ecx*5
  31.     shr    ecx, 19            ;ecx :100k byte 単位
  32.     push    ecx
  33.  
  34.     mov    ecx, 10
  35.     lea    edi, BUFFER
  36.     mov    edx, edi
  37.     call    bn4dec
  38.     lea    edx, MES1
  39.     mov    ecx, MES1LEN
  40.     call    putstr
  41.     
  42.     pop    eax
  43.     mov    ebx, eax        ;bx に値を保存
  44.  
  45.     mov    cl, 10            ;ax を10進数に
  46.     div    cl
  47.     add    al, '0'
  48.     lea    edi, BUFFER2
  49.     mov    [edi], al
  50.     add    edi, 2
  51.     add    ah, '0'
  52.     mov    [edi], ah
  53.     lea    edx, MES2
  54.  
  55.     mov    ecx, MES2LEN
  56.     call    putstr
  57.     
  58.     mov    ax, bx            ;errorlevel <- 100k byte 単位
  59.     msdos    F$EXIT
  60.  
  61.  
  62. ;******************************
  63. ; bn4dec
  64. ;  符号なし4バイト2進数を
  65. ;  10進ASCII数字に変換。
  66. ;  指定された幅の欄に右寄せ。
  67. ;  あふれた文字は削除。
  68. ;
  69. ; in : eax = 2進数下位ワード
  70. ;      ecx = 欄幅 (通常10)
  71. ;      edi = 文字列格納番地
  72. ; out: edi = 文字列末尾番地
  73. ; use: none
  74. ;
  75. bn4dec    proc    near
  76.     push    eax
  77.     push    ebx
  78.     push    ecx
  79.     push    edx
  80.  
  81.     add    edi, ecx    ; 末尾番地
  82.     push    edi
  83.  
  84.     dec    edi        ; 数字列最下位桁番地
  85.     mov    ebx,10        ; 除数=10
  86. bn4de1:    xor    edx,edx
  87.     div    ebx
  88.     add    dl,'0'        ; ASCII数字に変換して
  89.     mov    [edi], dl    ; バッファに格納
  90.     dec    edi        ; ポインタを上位桁位置へ
  91.     test    eax, eax    ; 桁が残っているか調べる
  92.     loopnz    short bn4de1
  93. ;
  94.     std            ; ディレクションフラグセット
  95.     mov    al,C$SPAC    ; 先頭は空白で埋める
  96.     rep    stosb
  97.     cld            ; ディレクションフラグクリア
  98.     pop    edi        ; 末尾番地
  99.     pop    edx
  100.     pop    ecx
  101.     pop    ebx
  102.     pop    eax
  103.     ret
  104. bn4dec    endp
  105.  
  106.  
  107. ;******************************
  108. ; putstr : 文字列を標準出力へ
  109. ;
  110. ; in : edx = 文字列基底番地
  111. ;      ecx = 文字列バイト長
  112. ; out: eax = 書き出したバイト数
  113. ; err: cf = キャリーセット
  114. ;      ax = エラーコード
  115. ;
  116. putstr    proc    near
  117.     push    bx
  118.     mov    bx,STDOUT
  119.     msdos    F$Write
  120.     pop    bx
  121.     ret
  122. putstr    endp
  123.  
  124. MES1    db    "Native Memory: "
  125. BUFFER    db    10 dup(?)
  126.     db    " byte free "
  127. MES1LEN    equ    $-MES1
  128.  
  129. MES2    db    "(about "
  130. BUFFER2    db    "?.?M byte)", C$CR, C$LF
  131. MES2LEN    equ    $-MES2
  132.  
  133. code    ends
  134.  
  135. end
  136.